#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1005
using namespace std;
int n,m,ans,flag,a[N][N],t[N][N],l,r,mi,maxn,vis[N][N];

void change(int x){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]<=x)t[i][j]=0;
            else t[i][j]=1;
        }
    }
}
void dfs(int x,int y){
    if(x==n){
        flag=1;
        return;
    }
    int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    for(int k=0;k<4;k++){
        int tx=x+d[k][0];
        int ty=y+d[k][1];
        if(tx>0&&ty>0&&tx<=n&&ty<=m){
            if(!vis[tx][ty]&&!t[tx][ty]){
                vis[tx][ty]=1;
                dfs(tx,ty);
                if(flag==1)break;
            }
        }
    }
}
int main(){
#ifndef ONLINE_JUDGE
   freopen("in2.txt" , "r", stdin);
#endif
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            maxn=max(maxn,a[i][j]);
        }
    }
    l=0;r=maxn;
    while(l+1<r){
        mi=(l+r)>>1;
        flag=0;
        change(mi);
        memset(vis,0,sizeof vis);
        dfs(1,1);
        if(flag)r=mi;
        else l=mi;
    }
    printf("%d\n",r);
    return 0;
    
}

